package com.example.onlineeducation.utils

import android.content.Context
import android.content.Intent
import android.location.LocationManager
import android.provider.Settings
import com.baidu.location.BDAbstractLocationListener
import com.baidu.location.BDLocation
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.example.onlineeducation.App
import com.yc.jetpacklib.extension.ycLogDSimple


/**
 * Creator: yc
 * Date: 2022/5/7 14:35
 * UseDes:
 */
class BaiduLocationUtil {
    companion object {
        /**
         * 判断GPS是否开启，GPS或者AGPS开启一个就认为是开启的
         * @return true 表示开启
         */
        @JvmStatic
        fun checkOpenLocation(): Boolean {
            val locationManager = App.mInstant.getSystemService(Context.LOCATION_SERVICE) as LocationManager
            // 通过GPS卫星定位，定位级别可以精确到街（通过24颗卫星定位，在室外和空旷的地方定位准确、速度快）
            val gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
            // 通过WLAN或移动网络(3G/2G)确定的位置（也称作AGPS，辅助GPS定位。主要用于在室内或遮盖物（建筑群或茂密的深林等）密集的地方定位）
            val network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
            return gps || network
        }

        /**
         * 强制帮用户打开GPS
         */
        @JvmStatic
        fun openGPS() {
            val settingsIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
            settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            App.mInstant.startActivity(settingsIntent)
        }

        /**
         * 检测获取定位信息是否有效
         * @param bdLocation BDLocation?
         */
        @JvmStatic
        fun checkResult(bdLocation: BDLocation?): Boolean {
            return bdLocation != null && bdLocation.latitude != 4.9E-324
        }
    }

    private var mLocationClient: LocationClient? = null
    var mResult: ((BDLocation?) -> Unit)? = null
    fun initLocation(context: Context) {
        mLocationClient = LocationClient(context)
        val option = LocationClientOption()
        //可选，是否需要地址信息，默认为不需要，即参数为false
        // 如果开发者需要获得当前点的地址信息，此处必须为true
        option.setIsNeedAddress(true)
        //可选，设置定位模式，默认高精度
        //LocationMode.Hight_Accuracy：高精度；
        //LocationMode. Battery_Saving：低功耗；
        //LocationMode. Device_Sensors：仅使用设备；
        option.locationMode = LocationClientOption.LocationMode.Hight_Accuracy
        //可选，设置返回经纬度坐标类型，默认GCJ02
        //GCJ02：国测局坐标；
        //BD09ll：百度经纬度坐标；
        //BD09：百度墨卡托坐标；
        //海外地区定位，无需设置坐标类型，统一返回WGS84类型坐标
        option.setCoorType("bd09ll")
        //可选，设置发起定位请求的间隔，int类型，单位ms
        //如果设置为0，则代表单次定位，即仅定位一次，默认为0
        //如果设置非0，需设置1000ms以上才有效
        option.setScanSpan(2000)
        //可选，设置是否使用gps，默认false
        //使用高精度和仅用设备两种定位模式的，参数必须设置为true
        option.isLocationNotify = true
        //可选，设置是否需要最新版本的地址信息。默认需要，即参数为true
        option.setNeedNewVersionRgc(true)

        //可选，设置是否收集Crash信息，默认收集，即参数为false
        option.SetIgnoreCacheException(false)
        mLocationClient!!.locOption = option
        mLocationClient!!.registerLocationListener(object : BDAbstractLocationListener() {
            override fun onReceiveLocation(bdLocation: BDLocation?) {
                mResult?.invoke(bdLocation)
                ycLogDSimple("百度定位:${bdLocation?.addrStr} latitude:${bdLocation?.latitude} longitude:${bdLocation?.longitude}")
            }
        })
    }

    fun start() {
        mLocationClient?.start()
    }

    fun stop() {
        mLocationClient?.stop()
    }
}